/**
 * 请实现一个 add 函数，满足以下功能
 *     add(1); 			// 1
    add(1)(2);  	// 3
    add(1)(2)(3)；// 6
    add(1)(2, 3); // 6
    add(1, 2)(3); // 6
    add(1, 2, 3); // 6
 * */ 


  // function sum(...args) {
  // //  console.log(arguments.length)
  //  return args.reduce((prev, current) => prev + current, 0)
  // }
  // console.log(sum(1))

function sum(a, b, c) {
  return a + b + c
}

// Lodash 中的柯里化函数
function curry(fn) {
  // curriedFn 为柯里化生产的新函数
  // 为什么不使用匿名函数？因为如果传入参数 args.length 小于 fn 函数的形参个数 fn.length，需要重新递归
  return function curriedFn(...args) {
    if (args.length < fn.length) {
      return function() {
        // 之前传入的参数都储存在 args 中
        // 新函数参入参数在 arguments，因为 arguments 并非真正的数组需要 Array.from() 转换成数组
        // 递归执行，重复之前的过程
        return curriedFn(...args.concat(Array.from(arguments)))
      }
    }
    return fn(...args)
  }
}

let add = curry(sum);

console.log(add(1)(2)(3));
console.log(add(2)(3, 4));
console.log(add(1, 2)(3));
console.log(add(1, 2, 3));

/**
 * 参考链接：
 * Javascript高级篇之函数柯里化 [https://www.cnblogs.com/caihongmin/p/17667130.html]
 * 【深入理解】柯里化&手写 Lodash 中 curry 函数｜ 技术点评 [https://juejin.cn/post/6939160922170605604]
 * */ 
